#!/usr/bin/bash
#
# Copyright 2009-2018 the Pacemaker project contributors
#
# The version control history for this file may have further details.
#
# This source code is licensed under the GNU General Public License version 2
# or later (GPLv2+) WITHOUT ANY WARRANTY.
#

USAGE_TEXT="Usage: crm_standby <command> [options]

Common options:
 --help                 Display this text, then exit
 --version              Display version information, then exit
 -V, --verbose          Specify multiple times to increase debug output
 -q, --quiet            Print only the standby status (if querying)

Commands:
 -G, --query            Query the current value of standby mode (on/off)
 -v, --update=VALUE     Update the value of standby mode (on/off)
 -D, --delete           Let standby mode use default value

Additional Options:
 -N, --node=NODE        Operate on the named node instead of the current one
 -l, --lifetime=VALUE   Until when should the setting take effect
                        (valid values: reboot, forever)
 -i, --id=VALUE         (Advanced) XML ID used to identify standby attribute"

HELP_TEXT="crm_standby - Query, enable, or disable standby mode for a node

Nodes in standby mode may not host cluster resources.

$USAGE_TEXT
"

exit_usage() {
    if [ $# -gt 0 ]; then
        echo "error:" "$@" >&2
    fi
    echo
    echo "$USAGE_TEXT"
    exit 1
}

op=""
options=""
lifetime=0
target=""

SHORTOPTS_DEPRECATED="U:Q"
LONGOPTS_DEPRECATED="uname:,get-value,delete-attr,attr-value:,attr-id:"
SHORTOPTS="VqGv:DN:l:i:"
LONGOPTS="help,version,verbose,quiet,query,update:,delete,node:,lifetime:,id:"

TEMP=$(/usr/bin/getopt -o ${SHORTOPTS}${SHORTOPTS_DEPRECATED} \
    --long ${LONGOPTS},${LONGOPTS_DEPRECATED} \
    -n crm_standby -- "$@")
if [ $? -ne 0 ]; then
    exit_usage
fi

eval set -- "$TEMP" # Quotes around $TEMP are essential

while true ; do
    case "$1" in
        --help)
            echo "$HELP_TEXT"
            exit 0
            ;;
        --version)
            crm_attribute --version
            exit 0
            ;;
        -q|--quiet|-V|--verbose|-Q)
            options="$options $1"
            shift
            ;;
        -N|--node|-U|--uname)
            target="$2"
            shift
            shift
            ;;
        -G|--query|--get-value)
            options="$options --query"
            op=g
            shift
            ;;
        -v|--update|--attr-value)
            options="$options --update $2"
            op=u
            shift
            shift
            ;;
        -D|--delete|--delete-attr)
            options="$options --delete"
            op=d
            shift
            ;;
        -l|--lifetime)
            options="$options --lifetime $2"
            lifetime=1
            shift
            shift
            ;;
        -i|--id|--attr-id)
            options="$options --id $2"
            shift
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            exit_usage "unknown option '$1'"
            ;;
    esac
done

# It's important to call cluster commands only after arguments are processed,
# so --version and --help work without problems even if those commands don't.
if [ "$target" = "" ]; then
    target=$(crm_node -n)
fi

options="-N $target -n standby $options"
if [ x$op = x ]; then
    options="$options -G"; op=g
fi

# If the user didn't explicitly specify a lifetime ...
if [ $lifetime -eq 0 ]; then
    case $op in
        g)
            # For query, report the forever entry if one exists, otherwise
            # report the reboot entry if one exists, otherwise report off.
            crm_attribute $options -l forever >/dev/null 2>&1
            if [ $? -eq 0 ]; then
                options="$options -l forever"
            else
                options="$options -l reboot -d off"
            fi
            ;;
        u)
            # For update, default to updating the forever entry.
            options="$options -l forever"
            ;;
        d)
            # For delete, default to deleting both forever and reboot entries.
            crm_attribute $options -l forever
            crm_attribute $options -l reboot
            exit 0
            ;;
    esac
fi

crm_attribute $options
